#pragma once
#include <iostream>
#include "InetAddr.hpp"
#include "Socket.hpp"
#include "LockGuard.hpp"
#include "Log.hpp"
#include"Protocol.hpp"
using namespace socket_ns;
using namespace log_ns;
using process_t =std::function<std::shared_ptr<Response>(std::shared_ptr<Request>)>;
class IOService
{
public:
    IOService(process_t process):_process(process)
    {
    }
    void IOExcute(SockSPtr sock, InetAddr &addr)
    {
        
        std::string message;
        while (true)
        {

            ssize_t n = sock->Recv(&message);
            if(n<=0)
            {
                LOG(INFO,"client %s quit or recv error\n",addr.AddrStr().c_str());
                break;
            }
            std::cout<<"-------------------------------------"<<std::endl;
            std::cout << "packagestreamqueue: \n" << message << std::endl;
            std::string package=Decode(message);
            if(package.empty()) continue;
            //
            auto req=Factory::BuildRequestDefault();
            std::cout << "package: \n" << package << std::endl;
            //3.反序列化
            req->Deserialize(package);
            //4.业务处理
            auto resp=_process(req);
            //5.序列化应答
            std::string respjson;
            resp->Serialize(&respjson);
            std::cout<<"respjson: \n"<<respjson<<std::endl;
            //6.添加len长度报头
            respjson=Encode(respjson);
            std::cout<<"respjson add header done: \n"<<respjson<<std::endl;
            //7.发送回去
            sock->Send(respjson);



           
        }
    }
    ~IOService()
    {
    }
private:
    process_t _process;
};